import "package:get/get.dart";
import 'package:package_info/package_info.dart';

import 'change_mark.dart';
import 'devices_typing.dart';

class PlatformCtrl {
  // 运行平台（ios/android）
  static SystemInfo _runPlatform;

  // 运行的设备（手机/PC/浏览器）
  static Device _runDevice;

  // 应用名称
  static String _appName;

  // 包名
  static String _packageName;

  // 应用版本号
  static String _version;

  // 存储控制器
  static ChangeMark _changeMark;

  // 标记
  static bool flag = false;

  // 阻止外界实例化
  PlatformCtrl._();

  // 内部实例化
  static PlatformCtrl _platformCtrl = PlatformCtrl._();

  // 向外界保留实例化函数
  static Future<PlatformCtrl> getInstance() async {
    // 获取平台信息（ios/android）
    await _getPlatformInfo();

    // 获取载体信息（移动设备|浏览器）
    await _getDeviceInfo();

    // 获取应用信息（应用名，包名，版本信息）
    await _getAppInfo();

    // 标记完成应用信息获取
    flag = true;

    // 发送通知
    // _changeMark.changeMark(flag);

    return _platformCtrl;
  }

  // 获取载体信息（应用app的设备）
  static Future<void> _getDeviceInfo() async {
    if (GetPlatform.isMobile) {
      _runDevice = Device.mobile;
    }

    if (GetPlatform.isDesktop) {
      _runDevice = Device.desktop;
    }

    if (GetPlatform.isWeb) {
      _runDevice = Device.browser;
    }
  }

  // 获取平台信息（ios/android）
  static Future<void> _getPlatformInfo() async {
    if (GetPlatform.isAndroid) {
      _runPlatform = SystemInfo.android;
    } else if (GetPlatform.isIOS) {
      _runPlatform = SystemInfo.ios;
    } else if (GetPlatform.isLinux) {
      _runPlatform = SystemInfo.linux;
    }

    // 固定赋值
    //_runPlatform = SystemInfo.android;
  }

  // 获取应用信息
  static Future<void> _getAppInfo() async {
    PackageInfo info = await PackageInfo.fromPlatform();
    _appName = info.appName;
    _packageName = info.packageName;
    _version = info.version;
  }

  // 创建一个对象实行观察
  static void putCtrl(ChangeMark c) => _changeMark = c;

  // 提供访问途径
  static PlatformCtrl get platformCtrl => _platformCtrl;

  static String get version => _version;

  static String get packageName => _packageName;

  static String get appName => _appName;

  static Device get runDevice => _runDevice;

  static SystemInfo get runPlatform => _runPlatform;

  // ****
  static set version(String value) {
    _version = value;
  }
}
